HSL ë° Lab ì ê³µê°ì ìŽì ì ë§ì¶ CSS ìë ìì 구묞 ì¢ í© ê°ìŽë. ì ìžê³ ì¹ ëììŽëê° ëì ìŽê³ ì ê·Œì± ëì ìì 첎ê³ë¥Œ ë§ë€ ì ìëë¡ ì§ìí©ëë€.
CSS ìë ìì 구묞 ìì ì ë³µ: êžë¡ë² ì¹ ëììžì ìí HSL ë° Lab ì ê³µê°
ì¹ ëììžì ìžê³ë ëìììŽ ì§ííê³ ììŒë©°, ìê°ì ìŒë¡ ë§€ë ¥ì ìŽê³ ì ê·Œì± ëì 겜íì ë§ëë ë° ì¬ì©íë ë구ì êž°ì ë ë§ì°¬ê°ì§ì ëë€. ìµê·Œ CSSì ì¶ê°ë ê°ì¥ í¥ë¯žë¡ìŽ êž°ë¥ ì€ íëë ìë ìì 구묞(Relative Color Syntax)ì ëë€. ìŽ ê°ë ¥í êž°ë¥ì ì¬ì©í멎 CSS ëŽìì ì§ì ììì ì¡°ìíì¬ ëì í ë§, 믞ë¬í ìì ë³í, ì ê·Œì± ëì ëììžì ëì± ìœê³ ì ì°íê² ë§ë€ ì ììµëë€. ìŽ êžììë HSL ë° Lab ì ê³µê°ì ìŽì ì ë§ì¶° ìë ìì 구묞ì ë³µì¡í ëŽì©ì ììží ììë³Žê³ , ìŽë¥Œ ì ìžê³ íë¡ì ížìì íì©íë ë°©ë²ì ìŽíŽëŽ ëë€.
CSS ìë ìì 구묞ìŽë 묎ììžê°ì?
ìë ìì êµ¬ë¬žìŽ ë±ì¥íêž° ì ìë CSSìì ììì ì¡°ìíë €ë©Ž ì¢ ì¢ Sassë Lessì ê°ì ì ì²ëŠ¬êž°ë¥Œ ì¬ì©íê±°ë JavaScriptì ì졎íŽìŒ íìµëë€. ìë ìì 구묞ì Ʞ졎 ììì CSS ê·ì¹ ëŽìì ì§ì ìì í ì ìê² íšìŒë¡ìš ìŽë¬í ìí©ì ë°ê¿ëë€. ìŽë ììì ê°ë³ êµ¬ì± ìì(ì: HSLì ìì¡°, ì±ë, ëª ë)륌 ì°žì¡°íê³ ì¬êž°ì ìíì ì°ì°ì ì ì©íë ë°©ììŒë¡ ìëí©ëë€. ìŠ, 믞늬 ì¬ë¬ ìì ë³íì ì ìí íì ììŽ íì¬ ê°ì êž°ë°ìŒë¡ ììì ë°ê², ìŽë¡ê², ì±ë륌 ëìŽê±°ë ë®ì¶ê±°ë ì조륌 ë³ê²œí ì ììµëë€.
ìŽ êµ¬ë¬žì color()
íšì륌 ì€ì¬ìŒë¡ 구ì¶ëìŽ, ì ê³µê°(ì: hsl
, lab
, lch
, rgb
, oklab
), ìì í Ʞ볞 ìì, ê·žëŠ¬ê³ ìíë ì¡°ì ì ì§ì í ì ììµëë€. ì륌 ë€ë©Ž ë€ì곌 ê°ìµëë€.
.element {
color: color(hsl red calc(h + 30) s l);
}
ìŽ ìœëë 빚ê°ìì ê°ì žì hsl
ì ê³µê°ì ì¬ì©íê³ ì조륌 30ë ìŠê°ìíµëë€. h
, s
, l
ì ê°ê° Ʞ졎ì ìì¡°, ì±ë, ëª
ë ê°ì ëíë
ëë€. calc()
íšìë ìíì ì°ì°ì ìííë ë° ë§€ì° ì€ìí©ëë€.
ì HSL곌 Labì ì¬ì©íŽìŒ í ê¹ì?
ìë ìì 구묞ì ë€ìí ì ê³µê°ê³Œ íšê» ìëíì§ë§, HSL곌 Labì ìì ì¡°ì ë° ì ê·Œì± ìž¡ë©Žìì ëë ·í ìŽì ì ì ê³µí©ëë€. ê·ž ìŽì 륌 ìŽíŽë³Žê² ìµëë€.
HSL (ìì¡°, ì±ë, ëª ë)
HSLì ìžê°ì ìžìì êž°ë°ìŒë¡ ììì ì§êŽì ìŒë¡ íííë ìíµí ì ê³µê°ì ëë€. ìž ê°ì§ êµ¬ì± ììë¡ ì ìë©ëë€.
- ìì¡°(Hue): ììíììì ìì ìì¹ (0-360ë). ìŒë°ì ìŒë¡ 빚ê°ìì 0ë, ë ¹ìì 120ë, íëìì 240ëì ëë€.
- ì±ë(Saturation): ììì ê°ë ëë ìë (0-100%). 0%ë íìì¡°ìŽê³ , 100%ë ìì í ììí ìì ëë€.
- ëª ë(Lightness): ìžì§ëë ììì ë°êž° (0-100%). 0%ë ê²ìììŽê³ , 100%ë í°ìì ëë€.
HSLì ì¥ì :
- ì§êŽì ìž ì¡°ì: HSLì ì§ê°ì í¹ì±ì êž°ë°ìŒë¡ ììì ìœê² ì¡°ì í ì ìê² í©ëë€. ëª ë륌 ëìŽë©Ž ìììŽ ë°ìì§ê³ , ì±ë륌 ë®ì¶ë©Ž íë €ì§ë©°, ì조륌 ë³ê²œí멎 ììíì ë°ëŒ ìììŽ ìŽëí©ëë€.
- ìì ì²Žê³ ìì±: HSLì ì¡°íë¡ìŽ ìì 첎ê³ë¥Œ ë§ëë 곌ì ì ëšìíí©ëë€. 볎ì(ìì¡° + 180ë), ì ì¬ì(ìë¡ ê°ê¹ìŽ ìì¡°), ìŒì(120ë ê°ê²©ì ìì¡°) ë±ì ìœê² ìì±í ì ììµëë€.
- ëì í ë§ ì ì©: HSLì ëì í ë§ ì ì©ì ìŽìì ì ëë€. Ʞ볞 ììì ì ìí ë€ì ìë ìì 구묞ì ì¬ì©íì¬ ëŒìŽíž 몚ëì ë€í¬ 몚ëì ëí ë€ìí ë³íì ìì±í ì ììµëë€.
ìì: ë€í¬ 몚ë í ë§ ë§ë€êž°
ëžëë ìììŽ #007bff
(ì ëª
í íëì)ëŒê³ ê°ì íŽ ëŽ
ìë€. HSLì ì¬ì©íì¬ ìŽëìŽ í겜ìì ëì íŒë¡ë¥Œ ëìŽì£Œë©Žì ëžëëì 볞ì§ì ì ì§íë ë€í¬ 몚ë í
ë§ë¥Œ ë§ë€ ì ììµëë€.
:root {
--brand-color: #007bff;
--brand-color-hsl: color(oklch #007bff h s l);
--bg-color: #fff;
--text-color: #000;
}
@media (prefers-color-scheme: dark) {
:root {
--bg-color: #121212; /* ìŽëìŽ íì */
--text-color: #fff;
--brand-color: color(hsl var(--brand-color) h calc(s * 0.8) calc(l * 1.2)); /* ì±ë륌 ìœê° ë®ì¶ê³ ë°ê² í ëžëë ìì */
}
}
body {
background-color: var(--bg-color);
color: var(--text-color);
}
.brand-button {
background-color: var(--brand-color);
color: #fff;
}
ìŽ ìì ììë ì¬ì©ìê° ë€í¬ ì»¬ë¬ ì€íŽì ì ížíëì§ íìží©ëë€. ë§ìœ ê·žë ë€ë©Ž, ìë ìì 구묞ì ì¬ì©íì¬ ìŽëìŽ ë°°ê²œê³Œì ëë¹ë¥Œ ëìŽêž° ìíŽ ëžëë ììì ì±ë륌 ìœê° ë®ì¶ê³ ë°ê² í©ëë€. ìŽë¥Œ íµíŽ ë€í¬ 몚ëìì ì¬ì©ì 겜íì ê°ì í멎ì ëžëë ì 첎ì±ì ìŒêŽëê² ì ì§í ì ììµëë€.
Lab (ëª ë, a, b)
Lab(ëë CIELAB)ì ì§ê°ì ìŒë¡ ê· ìŒíëë¡ ì€ê³ë ì ê³µê°ì ëë€. ìŽë ìì ê°ì ë³íê° ìì ììì êŽê³ììŽ ìžì§ëë ìì ì°šìŽì ë³íì ì ì¬íê² ëìëë€ë ê²ì ì믞í©ëë€. ìž ê°ì§ êµ¬ì± ììë¡ ì ìë©ëë€.
- L: ëª ë (0-100%). 0ì ê²ìì, 100ì í°ìì ëë€.
- a: ë ¹ì-빚ê°ì ì¶ììì ìì¹. ìì ê°ì ë ¹ì, ìì ê°ì 빚ê°ìì ëë€.
- b: íëì-ë žëì ì¶ììì ìì¹. ìì ê°ì íëì, ìì ê°ì ë žëìì ëë€.
Labì ì¥ì :
- ì§ê°ì ê· ìŒì±: Labì ì§ê°ì ê· ìŒì±ì ìì 볎ì ìŽë ì ê·Œì± ê²ì¬ì ê°ìŽ ì íí ìì ì°šìŽê° ì€ìí ìì ì ìŽìì ì ëë€.
- ëì ì ìì(Gamut): Labì RGBë HSLë³Žë€ ë ëì ë²ìì ììì ííí ì ììµëë€.
- ì ê·Œì±: Labì í ì€ížì 배겜 ê°ì ì¶©ë¶í ìì ëë¹ë¥Œ 볎ì¥íêž° ìí ì ê·Œì± ê³ì°ì ì죌 ì¬ì©ë©ëë€. WCAG(ì¹ ìœí ìž ì ê·Œì± ì§ì¹š)ë Lab ì ê³µê°ê³Œ ë°ì íê² êŽë šë ìë íë륌 êž°ë°ìŒë¡ í ê³µìì ì¬ì©í©ëë€.
ìì: ì ê·Œì±ì ìí ìì ëë¹ ê°ì
ì¶©ë¶í ìì ëë¹ë¥Œ 볎ì¥íë ê²ì ì ê·Œì±ì ë§€ì° ì€ìí©ëë€. í ì€íž ìì곌 배겜 ìììŽ WCAG AA ëª ìë¹ ì구ì¬í(4.5:1)ì 충족íì§ ëª»íë€ê³ ê°ì íŽ ëŽ ìë€. Labì ì¬ì©íì¬ ì구ì¬íì 충족í ëê¹ì§ í ì€íž ììì ëª ë륌 ì¡°ì í ì ììµëë€.
ì°žê³ : ìë ìì 구묞ì ì¬ì©íì¬ CSSìì ì§ì ëª ìë¹ë¥Œ ì¡°ìíë ê²ì ë¶ê°ë¥íì§ë§, ìŽë¥Œ ì¬ì©íì¬ ëª ë륌 ì¡°ì í í ëª ìë¹ ê²ì¬ ë구륌 ì¬ì©íì¬ ê²°ê³Œë¥Œ íìží ì ììµëë€.
.text {
color: var(--text-color);
background-color: var(--bg-color);
}
:root {
--text-color: #333;
--bg-color: #eee;
}
/* ìì: ìŽ ìœëê° ì§ì ëª
ìë¹ë¥Œ ê³ì°íì§ë ììµëë€. */
/* ëª
ë륌 ì¡°ì íë ê°ë
ì ìž ììì
ëë€. */
.accessible-text {
--current-text-color: var(--text-color);
color: color(lab var(--current-text-color) calc(l + 10) a b); /* í
ì€ížë¥Œ 10 ëšìë§íŒ ë°ê² í©ëë€. ìŽë í
ì€íž ììì L ê°ìŽ 100ì ê°ê¹ìž ê²œì° í¹ì ì§ì ê¹ì§ë§ íšê³Œê° ììµëë€. ìŽë¡ê² íë €ë©Ž ê°ì ë¹ŒìŒ í©ëë€. */
}
ìŽ ììììë ëë¹ë¥Œ ê°ì íêž° ìíŽ í ì€íž ììì ë°ê² íë €ê³ ìëíê³ ììµëë€. CSSìì ëª ìë¹ë¥Œ ê³ì°í ì ììŒë¯ë¡ ìì í 결곌륌 íìžíê³ íìì ë°ëŒ ë€ë¬ìŽìŒ í©ëë€.
Oklab: Labì ê°ì í
Oklabì Labì ëª ê°ì§ ëšì ì íŽê²°íêž° ìíŽ ì€ê³ë ë¹êµì ìë¡ìŽ ì ê³µê°ì ëë€. íšì¬ ë ëì ì§ê°ì ê· ìŒì±ì 목íë¡ íì¬, ìì ê°ì ë³íê° ìžì§ëë ììì ìŽë»ê² ìí¥ì ë¯žì¹ ì§ ììž¡íêž° ë ìœê² ë§ëëë€. ë§ì ê²œì° Oklabì í¹í ì±ëì ëª ë륌 ë€ë£° ë Labë³Žë€ ë ë¶ëëœê³ ìì°ì€ë¬ìŽ ìì ì¡°ì ë°©ë²ì ì ê³µí©ëë€.
ìë ìì 구묞곌 íšê» Oklabì ì¬ì©íë ê²ì Labì ì¬ì©íë ê²ê³Œ ì ì¬í©ëë€. ëšìí ì ê³µê°ìŒë¡ oklab
ì ì§ì í멎 ë©ëë€.
.element {
color: color(oklab #ff0000 calc(l * 1.1) a b); /* ììì 10% ë°ê² íš */
}
ì€ì©ì ìž ìì ë° ì¬ì© ì¬ë¡
HSL ë° Lab곌 íšê» ì¬ì©íë ìë ìì 구묞ì ì¹ ëììžì êŽë²ìí ê°ë¥ì±ì ìŽìŽì€ëë€. ëª ê°ì§ ì€ì©ì ìž ììë ë€ì곌 ê°ìµëë€.
- ìì íë íž ìì±: Ʞ볞 ììì ë§ë ë€ì HSLì ì¬ì©íì¬ ë³Žì, ì ì¬ì ëë ìŒì íë ížë¥Œ ìì±í©ëë€.
- ìì ê°ì¡°: ë§ì°ì€ë¥Œ ì¬ëŠ¬ê±°ë í¬ì»€ì€í ë ììì 배겜ìì ë°ê² íê±°ë ìŽë¡ê² íì¬ ìê°ì íŒëë°±ì ì ê³µí©ëë€.
- 믞ë¬í ë³í ë§ë€êž°: ìì¡°ë ì±ëì ìœê°ì ë³í륌 ì£ŒìŽ ê¹ìŽì ìê°ì í¥ë¯žë¥Œ ëí©ëë€.
- ëì í ë§ ì ì©: ëŒìŽíž ë° ë€í¬ 몚ë륌 구ííê±°ë ì¬ì©ìê° ì¹ì¬ìŽížì ìì 첎ê³ë¥Œ ì¬ì©ì ì ìí ì ìëë¡ íì©í©ëë€.
- ì ê·Œì± ê°ì : ìê° ì¥ì ê° ìë ì¬ì©ì륌 ìíŽ ì¶©ë¶í ëë¹ë¥Œ 볎ì¥íëë¡ ììì ì¡°ì í©ëë€.
ìì: HSLë¡ ìì íë íž ìì±íêž°
:root {
--base-color: #29abe2; /* ë°ì íëì */
--complementary-color: color(hsl var(--base-color) calc(h + 180) s l);
--analogous-color-1: color(hsl var(--base-color) calc(h + 30) s l);
--analogous-color-2: color(hsl var(--base-color) calc(h - 30) s l);
--triadic-color-1: color(hsl var(--base-color) calc(h + 120) s l);
--triadic-color-2: color(hsl var(--base-color) calc(h - 120) s l);
}
.base {
background-color: var(--base-color);
}
.complementary {
background-color: var(--complementary-color);
}
.analogous-1 {
background-color: var(--analogous-color-1);
}
.analogous-2 {
background-color: var(--analogous-color-2);
}
.triadic-1 {
background-color: var(--triadic-color-1);
}
.triadic-2 {
background-color: var(--triadic-color-2);
}
ìŽ ììë ëšìŒ Ʞ볞 ììì êž°ë°ìŒë¡ HSLì ì¬ì©íì¬ ìì íë ížë¥Œ ìì±íë ë°©ë²ì 볎ì¬ì€ëë€. ìŽ ìœë륌 ìœê² ìì íì¬ ë€ìí ìì ì¡°í륌 ë§ë€ê³ í¹ì ëììž ì구ì ë§ê² ì¡°ì í ì ììµëë€.
ìì: LabìŒë¡ ížë² íšê³Œ ë§ë€êž°
.button {
background-color: #4caf50; /* ë
¹ì */
color: #fff;
border: none;
padding: 10px 20px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.button:hover {
background-color: color(lab #4caf50 l calc(a * 1.1) calc(b * 1.1)); /* aì b ê°ì ìœê° ë°ê² íê³ ìŠê°ìíŽ */
}
ì¬êž°ìë Labì ì¬ì©íì¬ ë§ì°ì€ë¥Œ ì¬ë žì ë ììì ìœê° ë°ê² íê³ ë¹šê°ì곌 ë žëì 쪜ìŒë¡ ìŽëììŒ ì¬ì©ììê² ë¯žë¬íì§ë§ ëì ëë ìê°ì íŒëë°±ì ì ê³µí©ëë€.
ëžëŒì°ì ížíì± ë° íŽë°±(Fallback)
몚ë ìë¡ìŽ CSS êž°ë¥ê³Œ ë§ì°¬ê°ì§ë¡ ëžëŒì°ì ížíì±ì ì€ìí ê³ ë € ì¬íì ëë€. ìë ìì 구묞ì Chrome, Firefox, Safari, Edge ë± ëë¶ë¶ì ìµì ëžëŒì°ì ìì ì§ìë©ëë€. ê·žë¬ë 구í ëžëŒì°ì ììë ì§ìëì§ ìì ì ììµëë€.
ì¹ì¬ìŽížê° 몚ë ëžëŒì°ì ìì ìëíëë¡ íë €ë©Ž ìë ìì 구묞ì ì§ìíì§ ìë ëžëŒì°ì ì ëí íŽë°±(ë첎 ìëš)ì ì ê³µíë ê²ìŽ ì€ìí©ëë€. CSS ë³ìì @supports
at-ruleì ì¬ì©íì¬ ìŽë¥Œ ìíí ì ììµëë€.
:root {
--base-color: #29abe2;
--highlight-color: #33b5e5; /* íŽë°± ìì */
}
@supports (color: color(hsl var(--base-color) h calc(s * 1.2) l)) {
:root {
--highlight-color: color(hsl var(--base-color) h calc(s * 1.2) l); /* ì§ìëë ê²œì° ìë ìì 구묞 ì¬ì© */
}
}
.highlight {
background-color: var(--highlight-color);
}
ìŽ ììììë íŽë°± ìì(#33b5e5
)ì ì ìí ë€ì @supports
at-ruleì ì¬ì©íì¬ ëžëŒì°ì ê° ìë ìì 구묞ì ì§ìíëì§ íìží©ëë€. ì§ìíë ê²œì° --highlight-color
ë³ì륌 ìë ìì 구묞ì ì¬ì©íì¬ ìì±ë ìììŒë¡ ì
ë°ìŽíží©ëë€. ìŽë ê² í멎 구í ëžëŒì°ì ì ì¬ì©ìê° ìµì ëžëŒì°ì ì ì íí ê°ì ììì ìëëëŒë ê°ì¡° íìë ìì륌 볌 ì ììµëë€.
ì ê·Œì± ê³ ë € ì¬í
ìë ìì 구묞ì ìê°ì ìŒë¡ ë§€ë ¥ì ìž ëììžì ë§ëë ê°ë ¥í ëêµ¬ê° ë ì ìì§ë§, ì ê·Œì±ì ê³ ë €íë ê²ìŽ ì€ìí©ëë€. ìì±íë ìì ì¡°í©ìŽ ìê° ì¥ì ê° ìë ì¬ì©ììê² ì¶©ë¶í ëë¹ë¥Œ ì ê³µíëì§ íìžíìžì. WebAIM Contrast Checkerì ê°ì ë구륌 ì¬ì©íì¬ ìì ì¡°í©ìŽ WCAG AA ëë AAA ëª ìë¹ ì구ì¬íì 충족íëì§ íìžíììì€.
ìì ìžìì ê°ìžì ë°ëŒ í¬ê² ë€ë¥Œ ì ìë€ë ì ì êž°ìµíìžì. ë€ìí ì íì ìë§¹ìŽë ìê° ì¥ì ê° ìë ì¬ì©ìì íšê» ëììžì í ì€ížíì¬ ì¹ì¬ìŽížë¥Œ ìœê² ìžìíê³ ìíž ìì©í ì ìëì§ íìžíë ê²ì ê³ ë €íììì€.
ê²°ë¡
CSS ìë ìì 구묞ì í¹í HSL ë° Lab ì ê³µê°ê³Œ ê²°í©ë ë ì¹ ëììŽëìê² ê²ì 첎ìžì ê° ë©ëë€. ìŽë¥Œ íµíŽ ëì í ë§, 믞ë¬í ìì ë³í, ì ê·Œì± ëì ëììžì ëì± ìœê³ ì ì°íê² ë§ë€ ì ììµëë€. HSL곌 Labì ì늬륌 ìŽíŽíê³ êµ¬í ëžëŒì°ì ì ëí íŽë°±ì ì ê³µíšìŒë¡ìš ìŽ ê°ë ¥í êž°ë¥ì íì©íì¬ ì ìžê³ ì¬ì©ì륌 ìí ìê°ì ìŒë¡ ë°ìŽëê³ í¬ì©ì ìž ê²œíì ë§ë€ ì ììµëë€.
ìë ìì 구묞ì íì ë°ìë€ì¬ ì¹ ëììž êž°ì ì í ëšê³ ëìŽì¬ëЬìžì. ë€ìí ì ê³µê°, ìíì ì°ì° ë° ì ê·Œì± ê³ ë € ì¬íì ì€ííì¬ ëªšë ì¬ëìê² ìëŠëµê³ í¬ì©ì ìž ì¹ì¬ìŽížë¥Œ ë§ëìžì.
ë ìì볎Ʞ
- MDN ì¹ ë¬žì - ìë ìì 구묞
- Lea Verouì ìë ìì 구묞ì ëí êž
- WebKit ëžë¡ê·ž - CSS ìë ìì 구묞
CSS ìë ìì 구묞ì ìŽíŽíê³ íì©íšìŒë¡ìš ì ìžê³ ì¬ì©ì륌 ë§ì¡±ìí€ë ëì± ëì ìŽê³ ì ê·Œì±ìŽ ëìŒë©° ìê°ì ìŒë¡ ë§€ë ¥ì ìž ì¹ì¬ìŽížë¥Œ ë§ë€ ì ììµëë€. ìììŒë¡ ëììží ëë íì ì ê·Œì±ê³Œ ì¬ì©ì 겜íì ìµì°ì ìŒë¡ ìê°íŽìŒ í©ëë€.